package com_.dxy_test_.bio_.file_;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description 传统IO（BIO）方式文件读写
 *
 * 传统IO基于流的形式，要读写数据，直接对接流Stream，读数据时直接从Stream中读取，写数据时直接写到Stream中
 *
 * 流，抽象的概念，比如水管，水就是字节数据，流只能是单向的
 *
 * 输入流：从外部设备流向应用程序
 *
 * 输出流：从应用程序流向外部设备
 *
 * PS：从开启流，到读完一次期间，线程会阻塞，比如一次读取1024个byte，一次读取一行
 *
 *
 * 先把文件从硬盘复制到内核空间缓存，在复制到用户空间缓存，再复制出去
 *
 * 4次线程上下文切换，2次DMA拷贝，2次CPU拷贝
 *
 * read：线程从用户态切换到内核态，去拷贝文件，之后read返回，线程从内核态切换到用户态，此为1、2次切换
 *
 * write：线程从用户态切换内核态，去写文件，之后write返回，线程从内核态切换回用户态，此为3、4次切换
 *
 * @Author dangxianyue
 * @Date 2022/11/5 14:54
 */
public class FileReadWriteTest {

    public static void main(String[] args) {
//        readTest();
//        writeTest();
        copyTest();

    }

    private static void readTest() {
        String filePath = "C:\\Users\\Alex\\Desktop\\app\\read.txt";
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));

            /*
             * BufferedReader提供了按行读取方法：
             * String readLine()
             * 连续读取若干字符，直到读取到换行符为止
             * 并将换行符之间读取到的字符以一个字符串返回
             * 若返回值为NULL，则表示读取到末尾。
             * 注意：该字符串不包含最后的换行符。
             */
            //String line = null;
            //while((line = br.readLine())!=null){
            //    System.out.println(line);
            //}

            String nameLine = br.readLine();
            String ageLine = br.readLine();
            String emailLine = br.readLine();
            String phoneLine = br.readLine();

            System.out.println("姓名：" + nameLine.split(":")[1]);
            System.out.println("年龄：" + ageLine.split(":")[1]);
            System.out.println("邮箱：" + emailLine.split(":")[1]);
            System.out.println("电话：" + phoneLine.split(":")[1]);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    br = null;
                }
            }
        }
    }

    private static void writeTest() {
        String filePath = "C:\\Users\\Alex\\Desktop\\app\\write.txt";
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filePath)));
            pw.println("姓名：党先约");//println自动换行
            pw.println("年龄：28");
            pw.println("邮箱：2216874549@qq.com");
            pw.println("手机：15013067867");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (pw != null) {
                pw.close();
            }
        }
    }

    private static void copyTest() {
        //上面的加上循环，读一行写一行即可
    }

}
